<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    // debugger;
    // var a, b, c;    变量声明提前
    // function fn() {  //把命名函数的整个函数体提前
    //     var x = 10;
    //     var y = 20;
    // }


    // 大家普遍认为: JS脚本(script) 加载完毕之后立即执行

    // js脚本从加载完毕,到开始执行,经历了哪些流程?
    // 1. 语法解析  -> 发生在代码执行之前,判断脚本中是否存在语法错误,如果有语法错误,脚本不执行
    // 2. 预编译/预解析  -> 发生在代码执行之前,对全局作用域/函数作用域的代码提前解析

    // 全局作用域的代码执行 -> 预解析
    // a. 变量提升 -> 将作用域中的变量声明提升到当前作用域的最前面(全局作用域 -> 当前脚本的最前面)
    // b. 确定函数体 -> 将命名函数的函数体提升到当前作用域的最前面

    // 函数作用域的代码执行 -> 预解析
    // a. 变量提升 -> 将作用域中的变量声明提升到当前作用域的最前面(全局作用域 -> 当前脚本的最前面)
    // b. 确定函数体 -> 将命名函数的函数体提升到当前作用域的最前面
    // c. 实参赋值给形参

    // 3. 解释执行  -> 代码自上而下按顺序执行

    // 语法错误演示 -> ";"使用了中文
    // var a = 10;
    // console.log(a);

    // var b = 20;
    // console.log(b);

    // var c = a + b；
    // console.log(c);

    // 全局作用域 -> 预编译
    // console.log(a, b, c); // undefined
    // console.log(fn);

    // var a = 10;
    // console.log(a);

    // var b = 20;
    // console.log(b);

    // var c = a + b;
    // console.log(c);

    // fn();
    // function fn() {
    //     var x = 10;
    //     var y = 20;
    // }

    function demo(a, b) {
        debugger;
        // var x,y;
        // function sayHello() {
        //     console.log("hello");
        // }
        // var a = 1,b = 2;


        var x = 10;
        var y = 20;

        function sayHello() {
            console.log("hello");
        }
        sayHello();
    }

    demo(1, 2);


</script>

</html>